NHibernate এর Attribute-based mapping টেকনিক ব্যবহার করে আপনি ক্লাস এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক স্থাপন করতে পারেন, যেখানে XML ফাইলের পরিবর্তে C# অ্যাট্রিবিউট ব্যবহার করা হয়। এটি কোড-বেসড কনফিগারেশনের জন্য আরও সুবিধাজনক এবং সহজ হতে পারে, বিশেষ করে ছোট বা মাঝারি আকারের অ্যাপ্লিকেশনের জন্য।
1. Attribute-based Mapping Overview
Attribute-based mapping হল একটি পদ্ধতি যা আপনার C# ক্লাসের উপর সরাসরি বিভিন্ন NHibernate অ্যাট্রিবিউট প্রয়োগ করে ডেটাবেসের টেবিল এবং কলামের সাথে সম্পর্ক স্থাপন করে। এতে ক্লাসের প্রপার্টি বা ফিল্ডগুলোর উপর বিভিন্ন মেটাডেটা অ্যাট্রিবিউট হিসেবে অ্যাপ্লাই করা হয়, যা NHibernate কে ডেটাবেসে মডেলটি কিভাবে ম্যাপ করতে হবে তা বলে।
এই পদ্ধতিতে Fluent NHibernate অথবা NHibernate's built-in attributes ব্যবহার করা হয়।
2. প্রধান অ্যাট্রিবিউটসমূহ
[Class]: ক্লাসের উপর অ্যাট্রিবিউট
এটি ক্লাসের মডেল টেবিলের সাথে সম্পর্ক স্থাপন করে। Table অ্যাট্রিবিউট দিয়ে টেবিলের নাম নির্ধারণ করা হয়।
[Class(Table = "Employee")]
public class Employee
{
// প্রপার্টি বা ফিল্ডস
}
[Id]: প্রাইমারি কীগুলির জন্য
এটি ক্লাসের প্রাইমারি কীগুলোর জন্য ব্যবহৃত হয়। Column অ্যাট্রিবিউট দিয়ে কলামের নাম দেওয়া হয়।
[Id(Name = "EmployeeId", Column = "employee_id")]
public int EmployeeId { get; set; }
[Property]: সাধারণ প্রপার্টির জন্য
কোনো সাধারণ প্রপার্টি যা ডেটাবেসের কলামের সাথে ম্যাপ হতে চায়, তাকে Property অ্যাট্রিবিউট ব্যবহার করে ঘোষণা করা হয়।
[Property(Column = "EmployeeName")]
public string Name { get; set; }
[ManyToOne]: অন্য ক্লাসের সাথে সম্পর্ক
যদি একাধিক অ্যাট্রিবিউট একে অপরের সাথে সম্পর্কিত হয়, তবে ManyToOne ব্যবহার করা হয়। এটি একটি সম্পর্ক (এফকে) স্থাপন করে।
[ManyToOne(Name = "Department", Column = "department_id")]
public Department Department { get; set; }
[OneToMany]: একাধিক সম্পর্কের জন্য
এটি ক্লাসের মধ্যে একাধিক সম্পর্ক স্থাপন করে, যেমন এক-থেকে-বহু (One-to-Many) সম্পর্ক।
[OneToMany(Name = "Employees", Key = "department_id")]
public IList<Employee> Employees { get; set; }
[Bag]: নন-অর্ডারড কালেকশন
Bag ব্যবহার করা হয় যখন সম্পর্কিত প্রপার্টি বা ফিল্ডগুলির কোনো নির্দিষ্ট অর্ডার নেই।
[Bag(Name = "Employees", Key = "department_id")]
public IList<Employee> Employees { get; set; }
[ManyToMany]: বহু-থেকে-বহু সম্পর্ক
এটি ব্যবহার করা হয় বহু-থেকে-বহু সম্পর্ক স্থাপনের জন্য, যেমন, একাধিক কর্মচারী একাধিক প্রকল্পে কাজ করতে পারে।
[ManyToMany(Name = "Projects", Table = "EmployeeProjects", Column = "project_id")]
public IList<Project> Projects { get; set; }
3. Mapping Example
এখন আসুন, একটি উদাহরণ দেখি যেখানে দুটি ক্লাস—Employee এবং Department এর মধ্যে সম্পর্ক তৈরি করা হয়েছে:
[Class(Table = "Employees")]
public class Employee
{
[Id(Name = "EmployeeId", Column = "employee_id")]
public int EmployeeId { get; set; }
[Property(Column = "EmployeeName")]
public string Name { get; set; }
[ManyToOne(Name = "Department", Column = "department_id")]
public Department Department { get; set; }
}
[Class(Table = "Departments")]
public class Department
{
[Id(Name = "DepartmentId", Column = "department_id")]
public int DepartmentId { get; set; }
[Property(Column = "DepartmentName")]
public string Name { get; set; }
[OneToMany(Name = "Employees", Key = "department_id")]
public IList<Employee> Employees { get; set; }
}
4. Configuration এবং SessionFactory Setup
এবার, SessionFactory এবং Session সেটআপ করা প্রয়োজন। এখানে Configuration এবং SessionFactory তৈরির প্রক্রিয়া দেওয়া হলো:
var configuration = new Configuration();
configuration.Configure(); // hibernate.cfg.xml ফাইল লোড করবে
configuration.AddAssembly(typeof(Employee).Assembly); // ক্লাসগুলি অ্যাসেম্বলিতে যোগ করা
var sessionFactory = configuration.BuildSessionFactory();
এটি Employee এবং Department ক্লাসগুলোকে সহকারে সেশন ফ্যাক্টরি তৈরি করবে, যেখানে Mapping এবং DB টেবিলের সাথে সম্পর্ক ইতিমধ্যে অ্যাট্রিবিউট দ্বারা প্রতিষ্ঠিত।
5. Advantages of Attribute-based Mapping
- Code-centric Approach: XML কনফিগারেশন ফাইলের পরিবর্তে কোডের মধ্যে Mapping পরিচালনা করা যায়, যা ডেভেলপারদের জন্য আরও সহজ এবং স্বচ্ছ।
- Reduced XML Overhead: অ্যাট্রিবিউট ব্যবহারের মাধ্যমে XML কনফিগারেশন ফাইলের প্রয়োজন কমে যায়।
- IntelliSense Support: কোড লেখার সময় IDE তে IntelliSense সুবিধা পাওয়া যায়, যা ডেভেলপারদের দ্রুত কাজ করতে সহায়তা করে।
6. Limitations
- Less Flexibility: কিছু পরিস্থিতিতে XML কনফিগারেশন আরও নমনীয় হতে পারে, কারণ সেখানে আরও বিস্তারিত কনফিগারেশন করা যায়।
- Cluttered Code: অ্যাট্রিবিউট-based mapping ব্যবহারে ক্লাসের কোডে অনেক অ্যাট্রিবিউট থাকতে পারে, যা কোডটিকে ক্লাটারড (গাদা) করে তুলতে পারে।
Attribute-based mapping NHibernate এর মধ্যে কোড-বেসড কনফিগারেশনের জন্য একটি শক্তিশালী পদ্ধতি, যা সহজ এবং দ্রুত অ্যাপ্লিকেশন ডেভেলপমেন্টে সহায়ক।
Read more